<?php

/**
 * Description of DataSource
 *
 * @author prometheus
 */
class XQL_DataSource extends x10_GeneralClass
{
    /**
	 * @var XQL_Action
	 */
	protected $xqlAction;

	/**
	 * Létre kell-e hozni az akcióobjektumot?
	 * Értékét akkor kell TRUE-ra állítani, ha az xqlAction nem egy akcióobjektumot,
	 * hanem egy osztálynevet tartalmaz. Konfigurációs állományban használatos
	 * az adatforrások prototipizálásánál - akció prototípusok létrehozására.
	 * @var Bool
	 */
	protected $xqlActionCreate = FALSE;

	/**
	 * @var XQL_DataSource_RecordManager
	 */
	protected $recordManager;

	/**
	 * @var XQL_Resultset
	 */
	protected $resultset;

	/**
	 * @var XQL_Statement
	 */
	protected $statement;

	public function __construct(x10_Config $config=NULL)
	{
		parent::__construct($config);

		$this->xqlActionCreate = (bool)$this->config->getConfigKey('xqlActionCreate');
		$this->xqlAction = $this->config->getConfigKey('xqlAction');

		if ($this->xqlActionCreate and is_string($this->xqlAction) and class_exists($this->xqlAction))
		{
			$a = $this->xqlAction;
			$this->xqlAction = new $a();
		}
	}

	/**
	 * Beállítja az akció-objektumot.
	 * @param XQL_Action $action
	 */
	public function setAction(XQL_Action $action)
	{
		$this->xqlAction = $action;
	}

	/**
	 * Visszaadja az akció objektumot.
	 * @return XQL_Action
	 */
	public function getAction()
	{
		return $this->xqlAction;
	}

	/**
	 * Előkészítéssel (prepare) megnyitja az adatforrást.
	 * @return XQL_Statement
	 */
	public function open()
	{
		$this->statement = $this->xqlAction->prepare();
		return $this->statement;
	}

	/**
	 * A nyitáskor visszakapott statement obektum futtatása után lezárja
	 * az adatforrást, beolvassa a visszakapott rekordokat.
	 * @return XQL_DataSource
	 */
	public function close()
	{
		$records = $this->statement->fetchAll();
		unset($this->recordManager);
		$this->recordManager = new XQL_DataSource_RecordManager();
		$this->recordManager->import($records);

		return $this;
	}

	/**
	 * Beállítja a visszatérési halmaz típusát.
	 * Példa: amennyiben létezik XQL_Resultset_ExtJS osztály, úgy type='ExtJS'
	 * elfogadott típus.
	 * @param String $type
	 */
	public function setResultsetType($type='')
	{
		$cls = 'XQL_Resultset';
		if (!empty($cls)) $cls .= '_'.$type;

		unset($this->resultset);
		$this->resultset = new $cls;
	}

	/**
	 * Kezelésre visszaadja a rekordokat.
	 * @return XQL_DataSource_RecordManager
	 */
	public function getRecords()
	{
		return $this->recordManager;
	}

	/**
	 * A beállított eredményhalmaz típusának megfelelően visszaadja a rekordokat.
	 * @return Mixed
	 */
	public function getResult()
	{
		$this->resultset->setup((array)$this->recordManager);
		return $this->resultset->get();
	}
}

?>
